package com.example.utils;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * 工具类-获取输入日期月份的工作日
 * 
 * @author ljl
 *
 */
public class WorkDaysUtils {
	// 假期
	private ArrayList<String> holiday1;
	// 调休
	public static String[] holiday2 = { "2020-01-19", // 春节_调休
			"2020-02-01", // 春节_调休
			"2020-04-26", // 清明_节调休
			"2020-05-09", // 劳动_节调休
			"2020-06-28", // 国庆节_调休
			"2020-09-27", // 国庆节_调休
			"2020-10-10" // 元旦_调休
	};

//	public static void main(String[] args) {
//		// TODO Auto-generated method stub
////		  System.out.println("2023年01月上班天数：" + queryMonthDay("2020-01-15"));
////        System.out.println("2020年02月上班天数：" + queryMonthDay("2020-02-10"));
////        System.out.println("2020年03月上班天数：" + queryMonthDay("2020-03-10"));
////        System.out.println("2020年04月上班天数：" + queryMonthDay("2020-04-10"));
////        System.out.println("2020年05月上班天数：" + queryMonthDay("2020-05-10"));
////        System.out.println("2020年06月上班天数：" + queryMonthDay("2020-06-10"));
////        System.out.println("2020年07月上班天数：" + queryMonthDay("2020-07-10"));
////        System.out.println("2020年08月上班天数：" + queryMonthDay("2020-08-10"));
////        System.out.println("2020年09月上班天数：" + queryMonthDay("2020-09-10"));
////        System.out.println("2020年10月上班天数：" + queryMonthDay("2020-10-10"));
////        System.out.println("2020年11月上班天数：" + queryMonthDay("2020-11-10"));
////        System.out.println("2020年12月上班天数：" + queryMonthDay("2020-12-10"));
//		System.out.println("2023年01月上班天数：" + queryBeforeAndAfterDay("2020-01-15"));
//		
//	}	/**

	/**
	 * 字符串转时间
	 *
	 * @param dateStr
	 * @param index
	 * @return
	 */
	public static Date StringToDate(String dateStr, int index) {
		DateFormat df = null;
		try {
			df = new SimpleDateFormat(dateFormat[index]);
			return df.parse(dateStr);
		} catch (Exception aioe) {
			return null;
		}
	}

	/**
	 * 定义常见的时间格式
	 */
	private static String[] dateFormat = { "yyyy-MM-dd HH:mm:ss", // 0
			"yyyy/MM/dd HH:mm:ss", // 1
			"yyyy年MM月dd日HH时mm分ss秒", // 2
			"yyyy-MM-dd", // 3
			"yyyy/MM/dd", // 4
			"yy-MM-dd", // 5
			"yy/MM/dd", // 6
			"yyyy年MM月dd日", // 7
			"HH:mm:ss", // 8
			"yyyyMMddHHmmss", // 9
			"yyyyMMdd", // 10
			"yyyy.MM.dd", // 11
			"yy.MM.dd", // 12
			"MM月dd日HH时mm分", // 13
			"yyyy年MM月dd日 HH:mm:ss", // 14
			"yyyy-MM-dd HH:mm", // 15
			"yyMMdd" // 16
	};

	/**
	 * 获取法定节假日或者调休
	 *
	 * @param num
	 * @return
	 */
	private List<String> holiday(int num) {
		if (num == 2) {
			return Arrays.asList(holiday2);
		} else {
			return holiday1;
		}
	}

	/**
	 * 去重
	 *
	 * @param str
	 * @return
	 */
	private static List<String> removal(List<String> str) {
		Set<String> s = new HashSet<String>(str);
		str.clear();
		str.addAll(s);
		return str;
	}

	/**
	 * 返回当月工作日
	 * 
	 * @param day
	 * @return
	 */
	public List<String> getWordDays(String day) {
		List<String> result = new ArrayList<String>();
		Calendar Day = Calendar.getInstance();
		Day.setTime(StringToDate(day, 3));
		// 获取该月天数
		int dayNum = Day.getActualMaximum(Calendar.DAY_OF_MONTH);
		// 月份数据集合
		for (int i = 1; i < dayNum + 1; i++) {
			String d = day.substring(0, 8) + ((i < 10) ? "0" + i : "" + i);
			// 去掉周末
			Calendar startDay = Calendar.getInstance();
			startDay.setTime(StringToDate(d, 3));
			int week = startDay.get(Calendar.DAY_OF_WEEK);
			if (7 != week && 1 != week) {
				result.add(d);
			}
		}

		// 获取法定节假日
		List<String> fdList = holiday(1);
		// 添加时间段中间应该上班的时间
		// 去除中间所有的法定假期
		result.removeAll(fdList);
		// 去重
		result = removal(result);
		Collections.sort(result);
		return result;
	}

	/**
	 * 当月工作日天数
	 *
	 * @return
	 */
	public int queryMonthDay(String day) {
		List<String> result = getWordDays(day);
		return result.size();
	}

	/**
	 * middlerDay [7,8] 7:"转正"前天数，8:"转正"后天数 查询本月【当前日期前】工作日天数和【当前日期后】工作日天数3
	 * 
	 * @param day 2020-01-15
	 * @return
	 */

	public int[] queryBeforeAndAfterDay(String day) {
		List<String> result = getWordDays(day);
		int[] middleDay = { result.indexOf(day), result.size() - 1 - result.indexOf(day) };
		return middleDay;
	}

	public ArrayList<String> getHoliday1() {
		return holiday1;
	}

	public void setHoliday1(ArrayList<String> holiday1) {
		this.holiday1 = holiday1;
	}

	/**
	 * 非工作日
	 * 
	 * @param day 2023-03-10 通过day获取当月日期
	 * @return
	 */
	public List<String> getNonworkdays(String day) {
		List<String> result = new ArrayList<String>();
		Calendar Day = Calendar.getInstance();
		Day.setTime(StringToDate(day, 3));
		// 获取该月天数
		int dayNum = Day.getActualMaximum(Calendar.DAY_OF_MONTH);
		// 月份数据集合
		for (int i = 1; i < dayNum + 1; i++) {
			String d = day.substring(0, 8) + ((i < 10) ? "0" + i : "" + i);
			// 获取周末
			Calendar startDay = Calendar.getInstance();
			startDay.setTime(StringToDate(d, 3));
			int week = startDay.get(Calendar.DAY_OF_WEEK);
			if (7 == week && 1 == week) {
				result.add(d);
			}
		}

		// 获取法定节假日
		List<String> fdList = holiday(1);
		// 将法定节假日填入
		result.addAll(fdList);
		// 去重
		result = removal(result);
		Collections.sort(result);
		return result;
	}

}
